//package com.learning.db.optimization;
//
//import org.apache.hadoop.conf.Configuration;
//import org.apache.hadoop.conf.Configured;
//import org.apache.hadoop.fs.Path;
//import org.apache.hadoop.io.LongWritable;
//import org.apache.hadoop.io.NullWritable;
//import org.apache.hadoop.io.Text;
//import org.apache.hadoop.mapreduce.Job;
//import org.apache.hadoop.mapreduce.Mapper;
//import org.apache.hadoop.mapreduce.Reducer;
//import org.apache.hadoop.mapreduce.lib.input.MultipleInputs;
//import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
//import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
//import org.apache.hadoop.util.Tool;
//import org.apache.hadoop.util.ToolRunner;
//import org.springframework.beans.BeanUtils;
//
//import java.io.IOException;
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Objects;
//
///**
// * ClassName: DBYB_MrJob
// * <p>
// * Date: 2018/3/30 10:16 【需求编号】
// *
// * @author Sam Sho
// * @version V1.0.0
// */
//public class DBYB_MrJob extends Configured implements Tool {
//
//
//    /**
//     * 计算往期数据 Mapper
//     */
//    static class CulOldMapper extends Mapper<LongWritable, Text, Text, DBYB_dataBean> {
//
//        /**
//         * 个人编号,作为一行数据的key
//         */
//        private Text aac999 = new Text();
//
//        @Override
//        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//            // 获取每行数据的值
//            String lineValue = value.toString().trim();
//            // 进行分割
//            String[] arr = lineValue.split("\\|");
//            aac999.set(arr[0]);
//            DBYB_dataBean dataBean = new DBYB_dataBean();
//            dataBean.loadDate(arr);
//            dataBean.setFlag("0");
//            context.write(aac999, dataBean);
//        }
//    }
//
//    /**
//     * 计算Mapper
//     */
//    static class CulMapper extends Mapper<LongWritable, Text, Text, DBYB_dataBean> {
//
//        /**
//         * 个人编号,作为一行数据的key
//         */
//        private Text aac999 = new Text();
//
//        @Override
//        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//            // 获取每行数据的值
//            String lineValue = value.toString().trim();
//            // 进行分割
//            String[] arr = lineValue.split("\\|");
//            aac999.set(arr[0]);
//            DBYB_dataBean dataBean = new DBYB_dataBean();
//            dataBean.loadDate(arr);
//            dataBean.setFlag("1");
//            context.write(aac999, dataBean);
//        }
//    }
//
//    /**
//     * 计算Reduce
//     */
//    static class CulReduce extends Reducer<Text, DBYB_dataBean, DBYB_dataBean, NullWritable> {
//
//        /**
//         * 自负费用
//         * rate1~2-普通参保人员支付比例
//         */
//        double[][] rate1 = {{0, 6000, 0, 800},
//                {6000, 10000, 0.3, 800},
//                {10000, 20000, 0.4, 2000}};
//
//        /**
//         * 普通人员-自负加合规费用比例
//         */
//        double[][] rate2 = {{20000, 50000, 0.5, 0},
//                {50000, 100000, 0.6, 15000},
//                {100000, 200000, 0.7, 45000},
//                {200000, Double.MAX_VALUE, 0.8, 115000}};
//
//        /**
//         * 自负费用
//         * 实时救助人员支付比例
//         */
//        double[][] rate3 = {{0.0000, 3000.0000, 0.0000, 800.0000},
//                {3000.0000, 6000.0000, 0.3500, 800.0000},
//                {6000.0000, 10000.0000, 0.3500, 1850.0000},
//                {10000.0000, 20000.0000, 0.4500, 3250.0000}};
//
//        /**
//         * 实时救助人员-自负加合规费用比例
//         */
//        double[][] rate4 = {{20000.0000, 50000.0000, 0.5500, 0.0000},
//                {50000.0000, 100000.0000, 0.6500, 16500.0000},
//                {100000.0000, 200000.0000, 0.7500, 49000.0000},
//                {200000.0000, Double.MAX_VALUE, 0.8500, 124000.0000}};
//
//        @Override
//        protected void reduce(Text key, Iterable<DBYB_dataBean> values, Context context) throws IOException, InterruptedException {
//            ArrayList<DBYB_dataBean> oldDatas = new ArrayList<>();
//            ArrayList<DBYB_dataBean> thisDatas = new ArrayList<>();
//            double sum_OwnExpense_add_sum_Compliance = 0;//累计自负费用+累计合规费用
//            double sum_POwnExpense = 0;//累计自负赔付
//            double sum_POwnExpense_add_Compliance = 0;//累计自负加合规赔付
//            double sumAkc254AddComplianceOwnExpense = 0;
//            // 区分往期并且合并计算需要数据
//            double sum_OwnExpense = 0.00;
//            double sum_Compliance = 0.00;
//
//            for (DBYB_dataBean value : values) {
//                DBYB_dataBean dataBean = new DBYB_dataBean();
//                BeanUtils.copyProperties(value, dataBean);
//                int flag = Integer.parseInt(dataBean.getFlag());
//                // 先计算往期
//                if (0 == flag) {
//                    // 自负往期累计
//                    sum_OwnExpense += Double.parseDouble(dataBean.getSOwnExpense());
//                    // 合规自费 往期累计
//                    sum_Compliance += Double.parseDouble(dataBean.getCompliance());
//                    // 自负+合规自费 往期累计
//                    sumAkc254AddComplianceOwnExpense += Double.parseDouble(dataBean.getOwnExpense_add_Compliance());
//                    oldDatas.add(dataBean);
//                } else {
//                    thisDatas.add(dataBean);
//                }
//            }
//
//            System.out.println(key + ": " + "~~~ OLD ~~~" + oldDatas.size() + "~~~ THIS ~~~" + thisDatas.size());
//
//            // 自负-赔付
//            double money = 0.00;
//            // 自负和合规自费费用-赔付
//            double money2 = 0.00;
//            for (DBYB_dataBean thisData : thisDatas) {
//
//                sum_OwnExpense += Double.parseDouble(thisData.getSOwnExpense());
//                sum_Compliance += Double.parseDouble(thisData.getCompliance());
//                sumAkc254AddComplianceOwnExpense += Double.parseDouble(thisData.getOwnExpense_add_Compliance());
//                // 普通
//                if (Objects.equals("0", thisData.getSlaveFlag()) || Objects.equals("无效", thisData.getSlaveFlag())) {
//
//                    // 自负金额-赔付计算
//                    if (sum_OwnExpense > 20000) {
//                        money = 6000;
//                    } else if (sum_OwnExpense < 6000) {
//                        money = 0;
//                    } else {
//                        for (double[] doubles : rate1) {
//                            if (sum_OwnExpense > doubles[0] && sum_OwnExpense <= doubles[1]) {
//                                money = (sum_OwnExpense - doubles[0]) * doubles[2] + doubles[3];
//                                break;
//                            }
//                        }
//                    }
//
//                    // 自负+ 计算后的合规 赔付费用
//                    if (sumAkc254AddComplianceOwnExpense <= 20000) {
//                        money2 = 0;
//                    } else {
//                        for (double[] doubles : rate2) {
//                            if (sumAkc254AddComplianceOwnExpense > doubles[0] && sumAkc254AddComplianceOwnExpense <= doubles[1]) {
//                                money2 = (sumAkc254AddComplianceOwnExpense - doubles[0]) * doubles[2] + doubles[3];
//                                break;
//                            }
//                        }
//                    }
//                } else {//救助
//                    if (sum_OwnExpense > 20000) {
//                        money = 7750;
//                    } else if (sum_OwnExpense < 3000) {
//                        money = 0;
//                    } else {
//                        for (double[] doubles : rate3) {
//                            if (sum_OwnExpense > doubles[0] && sum_OwnExpense <= doubles[1]) {
//                                money = (sum_OwnExpense - doubles[0]) * doubles[2] + doubles[3];
//                                break;
//                            }
//                        }
//                    }
//
//                    // 自负+ 计算后的合规 赔付费用
//                    if (sumAkc254AddComplianceOwnExpense <= 20000) {
//                        money2 = 0;
//                    } else {
//                        for (double[] doubles : rate4) {
//                            if (sumAkc254AddComplianceOwnExpense > doubles[0] && sumAkc254AddComplianceOwnExpense <= doubles[1]) {
//                                money2 = (sumAkc254AddComplianceOwnExpense - doubles[0]) * doubles[2] + doubles[3];
//                                break;
//                            }
//                        }
//                    }
//                }
//
//                sum_POwnExpense = sum_POwnExpense + money;//累计自负赔付
//                sum_POwnExpense_add_Compliance = sum_POwnExpense_add_Compliance + money2;//累计自负加合规赔付
//                sum_OwnExpense_add_sum_Compliance = sum_OwnExpense + sum_Compliance;//累计自负费用+累计合规费用
//                //获取系统当前时间
//                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                String tCurrentDate = df.format(System.currentTimeMillis());
//
//                thisData.setSum_OwnExpense(String.valueOf((int) (sum_OwnExpense * 100) / 100));
//                thisData.setMoney(String.valueOf((int) (money * 100) / 100));
//                thisData.setSum_POwnExpense(String.valueOf((int) (sum_POwnExpense * 100) / 100));
//                thisData.setSum_Compliance(String.valueOf((int) (sum_Compliance * 100) / 100));
//                thisData.setSum_OwnExpense_add_sum_Compliance(String.valueOf((int) (sum_OwnExpense_add_sum_Compliance * 100) / 100));
//                thisData.setMoney2(String.valueOf((int) (money2 * 100) / 100));
//                thisData.setSum_POwnExpense_add_Compliance(String.valueOf((int) (sum_POwnExpense_add_Compliance * 100) / 100));
//                thisData.setSystemdate(tCurrentDate);
//                context.write(thisData, NullWritable.get());
//            }
//        }
//    }
//
//    @Override
//    public int run(String[] args) throws Exception {
//        Configuration conf = getConf();
//        Job job = Job.getInstance(conf, DBYB_MrJob.class.getSimpleName());
//        job.setJarByClass(DBYB_MrJob.class);
//
//        //如果有过往数据
//        if (args.length > 2) {
//            MultipleInputs.addInputPath(job, new Path(args[0]), TextInputFormat.class, CulOldMapper.class);
//            MultipleInputs.addInputPath(job, new Path(args[1]), TextInputFormat.class, CulMapper.class);
//            FileOutputFormat.setOutputPath(job, new Path(args[2]));
//        } else {//如果没有过往数据
//            MultipleInputs.addInputPath(job, new Path(args[0]), TextInputFormat.class, CulMapper.class);
//            FileOutputFormat.setOutputPath(job, new Path(args[1]));
//        }
//        // map settings
////        job.setMapperClass(DBYB_MrJob.CulMapper.class);
////        job.setMapperClass(DBYB_MrJob.CulOldMapper.class);
//        job.setMapOutputKeyClass(Text.class);
//        job.setMapOutputValueClass(DBYB_dataBean.class);
//
//        // reduce settings
//        job.setReducerClass(CulReduce.class);
//        job.setOutputKeyClass(DBYB_dataBean.class);
//        job.setOutputValueClass(NullWritable.class);
//
//
//        // reduce的分数与年份保持一致
////        job.setPartitionerClass(PersonPartition.class);
////        job.setSortComparatorClass(SortDate.class);
////        job.setGroupingComparatorClass(GroupPerson.class);
//
//        boolean res = job.waitForCompletion(true);
//
//        return res ? 0 : 1;
//    }
//
//
//    public static void main(String[] args) throws Exception {
//        Configuration configuration = new Configuration();
//
////        configuration.set("fs.defaultFS", "hdfs://hadoop1:9000");
////        System.setProperty("HADOOP_USER_NAME", "hadoop");
////        args = new String[]{"/dbyb/input/t_db_intermediate_person_compliance", "/dbyb/out/t_db_intermediate_person_compliance"};
//
//        configuration.set("fs.defaultFS", "hdfs://newlistest02:9000");
//        System.setProperty("HADOOP_USER_NAME", "sinosoft");
//        args = new String[]{"/dbyb3/input/oneperson/testvalue5", "/dbyb3/out/test_201"};
//
//
//        ToolRunner.run(configuration, new DBYB_MrJob(), args);
//    }
//
//}
